home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / playlist.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  9.2 KB  |  260 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Miro playlist support.'''
  5. from gtcache import gettext as _
  6. import app
  7. import dialogs
  8. import database
  9. import filters
  10. import menu
  11. import item
  12. import views
  13. import sorts
  14. from databasehelper import makeSimpleGetSet, TrackedIDList
  15.  
  16. class PlaylistMixin:
  17.     '''Class that handles basic playlist functionality.  PlaylistMixin is used
  18.     by both SavedPlaylist and folder.PlaylistFolder.
  19.     '''
  20.     
  21.     def setupTrackedItemView(self):
  22.         self.trackedItems = TrackedIDList(views.items, self.item_ids)
  23.         views.items.addRemoveCallback(self.onItemRemoved)
  24.  
  25.     
  26.     def onItemRemoved(self, obj, id):
  27.         if id in self.trackedItems:
  28.             self.trackedItems.removeID(id)
  29.         
  30.  
  31.     
  32.     def getItems(self):
  33.         '''Get the items in this playlist.'''
  34.         self.confirmDBThread()
  35.         return [ i for i in self.getView() ]
  36.  
  37.     
  38.     def getView(self):
  39.         return self.trackedItems.view
  40.  
  41.     
  42.     def setSearch(self, searchTerms):
  43.         """Set a search to limit the items in this playlist.  
  44.  
  45.         NOTE: When this is called by the template code, it will change the
  46.         results of getView() and getItems().  I (BDK), feel like this is a
  47.         kind of ugly design, but I don't want to change things right now,
  48.         because that would involve extra sorts on the playlist view.  Right
  49.         now the only time we use getView() is in the template code, so I
  50.         didn't want to fix an issue that doesn't matter.
  51.         """
  52.         
  53.         def searchFilter(obj):
  54.             return filters.matchingItems(obj, searchTerms)
  55.  
  56.         self.trackedItems.setFilter(searchFilter)
  57.  
  58.     
  59.     def getFolder(self):
  60.         pass
  61.  
  62.     
  63.     def addID(self, id):
  64.         '''Add a new item to end of the playlist.  '''
  65.         self.confirmDBThread()
  66.         item = views.items.getObjectByID(id)
  67.         item.save()
  68.         if id not in self.trackedItems:
  69.             self.trackedItems.appendID(id)
  70.         
  71.         folder = self.getFolder()
  72.         if folder is not None:
  73.             folder.addID(id)
  74.         
  75.         self.signalChange()
  76.  
  77.     
  78.     def removeID(self, id):
  79.         '''Remove an item from the playlist.'''
  80.         self.confirmDBThread()
  81.         self.trackedItems.removeID(id)
  82.         folder = self.getFolder()
  83.         if folder is not None:
  84.             folder.addID(id)
  85.         
  86.         self.signalChange()
  87.  
  88.     
  89.     def moveID(self, id, newPosition):
  90.         """Change the position of an item in the playlist.
  91.  
  92.         This method works the same as list.insert().  The item will be
  93.         inserted at the index newPosition, items that are currently at that
  94.         index or after it will be moved back one position.  If new position is
  95.         after the end of the list, the item will be added at the end, if it's
  96.         less than 0 it will be added at the begining.
  97.         """
  98.         self.confirmDBThread()
  99.         self.trackedItems.moveID(id, newPosition)
  100.         self.signalChange()
  101.  
  102.     
  103.     def addItem(self, item):
  104.         return self.addID(item.getID())
  105.  
  106.     
  107.     def removeItem(self, item):
  108.         return self.removeID(item.getID())
  109.  
  110.     
  111.     def moveItem(self, item, newPosition):
  112.         return self.moveID(item.getID(), newPosition)
  113.  
  114.     
  115.     def handleDNDAppend(self, draggedIDs):
  116.         for id in draggedIDs:
  117.             if not views.items.idExists(id):
  118.                 raise KeyError('%s is not an item id' % id)
  119.             
  120.             item = views.items.getObjectByID(id)
  121.             if not item.isContainerItem:
  122.                 self.addID(id)
  123.                 continue
  124.             for child in item.getChildren():
  125.                 self.addID(child.getID())
  126.             
  127.         
  128.  
  129.     
  130.     def handleDNDReorder(self, anchorItem, draggedItems):
  131.         '''Handle drag-and-drop reordering of the playlist.'''
  132.         for iid in draggedItems:
  133.             if iid not in self.trackedItems:
  134.                 raise ValueError('id not in playlist folder: %s', iid)
  135.                 continue
  136.         
  137.         if anchorItem is not None:
  138.             self.trackedItems.moveIDList(draggedItems, anchorItem.getID())
  139.         else:
  140.             self.trackedItems.moveIDList(draggedItems, None)
  141.         self.signalChange()
  142.  
  143.     
  144.     def recomputeSort(self):
  145.         self.trackedItems.recomputeSort()
  146.  
  147.  
  148.  
  149. class SavedPlaylist(database.DDBObject, PlaylistMixin):
  150.     """An ordered list of videos that the user has saved.
  151.  
  152.     This class is called SavedPlaylist to distinguish it from app.Playlist,
  153.     which is a temporary playlist that holds the videos we're playing right
  154.     now.
  155.     """
  156.     
  157.     def __init__(self, title, items = None):
  158.         self.title = title
  159.         self.folder_id = None
  160.         self.setupTrackedItemView()
  161.         database.DDBObject.__init__(self)
  162.  
  163.     
  164.     def onRestore(self):
  165.         self.setupTrackedItemView()
  166.  
  167.     (getTitle, setTitle) = makeSimpleGetSet('title')
  168.     
  169.     def getFolder(self):
  170.         self.confirmDBThread()
  171.         if self.folder_id is not None:
  172.             return self.dd.getObjectByID(self.folder_id)
  173.         else:
  174.             return None
  175.  
  176.     
  177.     def setFolder(self, newFolder):
  178.         self.confirmDBThread()
  179.         old_folder_id = self.folder_id
  180.         if newFolder is not None:
  181.             self.folder_id = newFolder.getID()
  182.         else:
  183.             self.folder_id = None
  184.         self.signalChange()
  185.         if old_folder_id is not None:
  186.             folder = views.playlistFolders.getObjectByID(old_folder_id)
  187.             for id in self.item_ids:
  188.                 folder.checkItemIDRemoved(id)
  189.             
  190.         
  191.  
  192.     
  193.     def handleRemove(self, ids):
  194.         """Handle the user removing a set of IDs.  This method will also check
  195.         the playlist folder we're in and remove the ID from there.
  196.         """
  197.         for id in ids:
  198.             self.removeID(id)
  199.         
  200.         folder = self.getFolder()
  201.         if folder:
  202.             for id in ids:
  203.                 folder.checkItemIDRemoved(id)
  204.             
  205.         
  206.  
  207.     
  208.     def getDragDestType(self):
  209.         self.confirmDBThread()
  210.         if self.folder_id is not None:
  211.             return 'playlist'
  212.         else:
  213.             return 'playlist:playlistfolder'
  214.  
  215.     
  216.     def makeContextMenu(self, templateName, view):
  217.         return menu.makeMenu([
  218.             ((self.rename, _('Rename Playlist')),),
  219.             ((lambda : app.controller.removePlaylist(self)), _('Remove'))])
  220.  
  221.     
  222.     def rename(self):
  223.         title = _('Rename Playlist')
  224.         description = _('Enter a new name for the playlist %s' % self.getTitle())
  225.         
  226.         def callback(dialog):
  227.             if self.idExists() and dialog.choice == dialogs.BUTTON_OK:
  228.                 self.setTitle(dialog.value)
  229.             
  230.  
  231.         dialogs.TextEntryDialog(title, description, dialogs.BUTTON_OK, dialogs.BUTTON_CANCEL).run(callback)
  232.  
  233.     
  234.     def remove(self, moveItemsTo = None):
  235.         if moveItemsTo is not None:
  236.             raise StandardError("Cannot 'move' a playlist to %s" % repr(moveItemsTo))
  237.         
  238.         database.DDBObject.remove(self)
  239.  
  240.  
  241.  
  242. def createNewPlaylist(childIDs = None):
  243.     '''Start the new playlist creation process.  This should be called in
  244.     response to the user clicking on the new playlist menu option.
  245.     '''
  246.     title = _('Create Playlist')
  247.     description = _('Enter a name for the new playlist')
  248.     
  249.     def callback(dialog):
  250.         if dialog.choice == dialogs.BUTTON_CREATE:
  251.             playlist = SavedPlaylist(dialog.value)
  252.             app.controller.selection.selectTabByObject(playlist)
  253.             if childIDs:
  254.                 playlist.handleDNDAppend(childIDs)
  255.             
  256.         
  257.  
  258.     dialogs.TextEntryDialog(title, description, dialogs.BUTTON_CREATE, dialogs.BUTTON_CANCEL).run(callback)
  259.  
  260.